package com.mini.grpc.spring.example;

import com.mini.grpc.spring.annotation.GrpcClient;
import com.mini.grpc.spring.annotation.GrpcService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Service;

/**
 * Spring集成使用示例
 * 演示如何使用@GrpcService和@GrpcClient注解
 * 
 * @author Mini-gRPC
 */
@SpringBootApplication
public class SpringIntegrationExample {
    
    public static void main(String[] args) {
        SpringApplication.run(SpringIntegrationExample.class, args);
    }
    
    /**
     * gRPC服务实现示例
     * 使用@GrpcService注解标记
     */
    @GrpcService(
        value = "hello-service",
        description = "Hello World gRPC Service",
        priority = 1
    )
    public static class HelloServiceImpl {
        // 这里应该实现具体的gRPC服务方法
        // 实际使用时需要继承生成的服务基类
    }
    
    /**
     * gRPC客户端使用示例
     * 使用@GrpcClient注解注入客户端存根
     */
    @Service
    public static class HelloClientService {
        
        // 注入阻塞式客户端存根
        @GrpcClient(
            value = "hello-client",
            address = "localhost:9090",
            callTimeoutMillis = 30000,
            retryEnabled = true,
            maxRetries = 3
        )
        private Object helloBlockingStub; // 实际使用时应该是具体的存根类型
        
        // 注入异步客户端存根
        @GrpcClient(
            value = "hello-async-client",
            address = "localhost:9090",
            keepAliveEnabled = true,
            keepAliveTimeSeconds = 30
        )
        private Object helloAsyncStub; // 实际使用时应该是具体的存根类型
        
        /**
         * 使用阻塞式客户端调用示例
         */
        public void callHelloBlocking() {
            // 实际使用时的调用示例：
            // HelloRequest request = HelloRequest.newBuilder()
            //     .setName("World")
            //     .build();
            // HelloResponse response = helloBlockingStub.sayHello(request);
            // System.out.println("Response: " + response.getMessage());
        }
        
        /**
         * 使用异步客户端调用示例
         */
        public void callHelloAsync() {
            // 实际使用时的调用示例：
            // HelloRequest request = HelloRequest.newBuilder()
            //     .setName("World")
            //     .build();
            // 
            // StreamObserver<HelloResponse> responseObserver = new StreamObserver<HelloResponse>() {
            //     @Override
            //     public void onNext(HelloResponse response) {
            //         System.out.println("Async Response: " + response.getMessage());
            //     }
            //     
            //     @Override
            //     public void onError(Throwable t) {
            //         System.err.println("Error: " + t.getMessage());
            //     }
            //     
            //     @Override
            //     public void onCompleted() {
            //         System.out.println("Call completed");
            //     }
            // };
            // 
            // helloAsyncStub.sayHello(request, responseObserver);
        }
    }
} 